[HBase]05 HBase容灾与监控 五

Hbase备份与恢复、CopyTable、Export/Import、Snapshot、Replication、DistCp 迁移、如何监控HBase集群、Ambari监控、Hadoop JMX监控

Posted by 李玉坤 on 2017-10-02

Hbase备份与恢复

四种方案:
◆Export / Import ◆CopyTable ●Replication ●Snapshot

CopyTable

  • 支持时间区间 、row区间,改变表名称, 改变列族名称,指定是否 Copy已经被删除的数据等功能,
  • CopyTable工具采用scan查询, 写入新表时采用put和delete API, 全是基于hbase的client Api进行读写
  • 在线,前提在目标集群中先建立好同名表

可以在本集群中拷贝一张表,也可以将表拷贝到其他的集群中。

1、利用CoprocessorTest来测试本集群中拷贝一张表

2、先创建一个表

3、执行CopyTable 操作

4、查看此时两表相同

5、如果是跨集群迁移

命令: ./hbase org.apache.hadoop.hbase.mapreduce.CopyTable –peer.adr=dest_cluster:2181:/hbase1

说明:
1)拷贝完成,不需要重启机器,在 new cluster 中就可以看到该表;
2)稳定性还需要考虑,测试过程中遇到一个问题,拷贝过程中始终都停留在这里
Lookedup root region location, 查看日志没有什么错误和相关的信息。

Export/Import

  • Export可导出数据到目标集群, 然后可在目标集群Import导入数据, Export支持指定开始时间和结束时间, 因此可以做增量备份.
  • Export导出工具与CopyTable一样是依赖hbase的scan读取数据
  • (在线,前提在目标集群中比较建立好同名表)


1、执行Export

查看hdfs目录是否有这个文件

2、执行Import
清空表


数据恢复

简要步骤:
1)在 old cluster 上执行:./hbase org.apache.hadoop.hbase.mapreduce.Export test hdfs://new cluster ip:9000/ test
2)在 new cluster 上执行:./hbase org.apache.hadoop.hbase.mapreduce.Import test hdfs://new cluster ip:9000/ test

说明:
1)一定要写全路径,不能写相对路劲;
2)在 import 前,需要将表事先在 new cluster 中创建好

Snapshot

  • Snapshot即快照的意思, 作用于表上;通过配置hbase-site.xml开启该功能

  • 可以快速的恢复表至快照指定的状态从而迅速的修复数据 (会丢失快照之后的数据)

对于快照操作的shell命令 进入hbase shell

测试列出快照;其他操作略

恢复数据

跨集群操作
1)生成快照:
$ ./bin/hbase shell
hbase> snapshot ‘myTable’, ‘myTableSnapshot-122112’
2)用快照克隆表(这个克隆操作不涉及数据拷贝,在新集群中操作):
$ hbase shell
hbase> clone_snapshot ‘myTableSnapshot-122112’, ‘myNewTestTable’
3)导出到另一集群:
要拷贝一张叫 MySnapshot 的快照到HBase集群srv2(hdfs://dest_cluester:8020/hbase)下,使用16个maptask
$ sudo -u hbase hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://dest_cluester:8020/hbase -mappers 16

说明:这个 ExportSnapshot 工具拷贝了整个快照相关的所有的数据到另一个集群上

Replication

  • 可以通过replication机制实现hbase集群的主从模式
  • Replication是依赖wal日志进行的同步(Replication必须开启WAL,修改hbase-site.xml)


简要步骤:

1)在 old cluster 将需要迁移的表属性进行修改:
disable ‘your_table’
alter ‘your_table’, {NAME => ‘family_name’, REPLICATION_SCOPE => ‘1’}
enable ‘your_table’

2)打开 new cluster 集群的 replication,修改 hbase-site.xml

3)添加 peer(主节点里添加要复制的从节点的),在 new cluster 的 hbase shell 中执行:add_peer ‘1’,’old cluster ip:2181:/hbase’,启动 replication,执行 start_replication

说明:需要两个集群的 hadoop 版本一致,否则出现读写错误

总结

  • CopyTable喝Export/Import这两种方式是基于MapReduce性能不是太高;
  • Replication是一种比较常见的方式;本质上利用了endpoint协处理器对WAL日志进行顺序读取来达到备份的目的;
  • Snapshot是作用于表上,实际上针对元数据的快照,并不直接备份HFile,所以说它可以快速的将表恢复的快照的状态,从而迅速的进行数据的修复;

DistCp 迁移(需要停掉集群)

1)旧的集群上先 disable alltable:
disable tablename(单张表 disable)
disable_all (整个 hbase 所有表 disable)
同理 enable tablename 以及 enable_all

2)hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hdfs://src_cluster:9000/hbase/tablename
hdfs://dest_cluester:8020/hbase/data/default/tablename
或者使用
hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hftp://src_cluster:50070/hbase/tablename
webhdfs://dest_cluester:50070/hbase/data/default/tablename
或者使用
hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update
hftp://src_cluster:50070/hbase/tablename
hftp://dest_cluester:50070/hbase/data/default/tablename
使用脚本进行迁移
将所有表名放在一个文件中进行读取:

1
2
3
4
5
#!/bin/bash
cat 'xx.txt' | while read line
do
hadoop distcp -Ddfs.checksum.type=CRC32 -skipcrccheck -i -update hftp://src_cluster:50070/hbase/$line webhdfs://dest_cluester:50070/hbase/data/default/$line sleep 5m(针对不同表的数据量,进行相应的睡眠等待上一张迁移成功再进行下一张的迁移,睡眠时间自行选择,看表的数据量自行定义)
done

注:具体细节需要各自实践进行调整

Kill 所有 DistCp 进程:
jps | grep DistCp | awk ‘{print $1}’ | xargs kill -9

DSTools 修复表操作(针对某平台环境,提供了修复工具):
sh runDSTools.sh tablename (单张表修复)
sh runDSTools.sh 1>&2 2> /tmp/xx.log.1(不加表名即表示整个集群修复,此处为脚本工具,可以参考 hbase 官网数据修复.MATE 修复部分)

DSTools 修复 Hfile 命令(针对某平台环境,提供了修复工具):
sh runHFileCheck.sh tablename 1>&2 2> /tmp/hfilecheck.log.1
sh runHFileCheck.sh -fixReferenceFiles -sidelineCorruptHFiles tablename 1>&2 2> /tmp/hfilecheck.log.2
sh runHFileCheck.sh tablename 1>&2 2> /tmp/hfilecheck.log.3

数据表修复时出现 regionserver 时常死亡时,请修改以下参数(可进行适当的调整)

1)hbase-site.xml 里,配置 hbase.ipc.server.max.callqueue.length 为 10。

hbase.ipc.server.max.callqueue.length
10

2)hbase-env.sh 里,修改配置:
-XX:CMSInitiatingOccupancyFraction=80 ==> -XX:CMSInitiatingOccupancyFraction=70
-XX:NewRatio=3 ==> -XX:NewRatio=4

3)hbase-env.sh 里,regionserver 的 heap size 只允许两种配置:
-Xms24000m -Xmx24000m 或者 -Xms30000m -Xmx30000m
如果机器内存比较充足,可以选后者,否则选前者。
批量删除 hbase 表命令:

1)先将所有 hbase 表的表名列出存在文件 hbase-tmp1 中
for i in echo 'list' | hbase shell;do echo $i >> /tmp/hbase-tmp1;done

2)打开这个文件删除不相干的信息,只保留表名信息

3)执行批量删除操作
for i in cat /tmp/hbase-tmp1;do echo "delete_table '$i'" | hbase shell;done
使用 delete_table 可以直接删除表,不要事先 disable,单张表删除可以使用
delete_table 直接删除或者先 disable tablename 再 drop

将 HDFS 中 hbase 表文件落地再迁移(集群不通)

把某个表(table1)从集群 1 迁移到集群 2(两个集群互相看不见),步骤如下

1)拷贝集群 1 的表文件到本地磁盘 :
/app/cloud/Hadoop/bin/hadoop fs -copyToLocal /hbase/table1 /data0/hbase-backup/table1

2)对于文件操作,很简单吧,随便你怎么去拷贝来拷贝去

3)如果集群 2 中也有对应的表文件,那么删除掉,然后拷贝
/app/cloud/hadoop/bin/hadoop fs -rmr /hbase/tablename
/app/cloud/hadoop/bin/hadoop fs -copyFromLocal /data0/hbase-backup/tablename /hbase/tablename

4)重置该表在.META.表中的分区信息
bin/hbase org.jruby.Main bin/add_table.rb /hbase/tablename

另外:
1)如果表的数据量过大呢? 那么按照该表在 HDFS 中的文件夹数据,分批拷
贝。
2)如果两个集群可以互相通信呢?采用DistCp方案即可

Hbase监控简介

为什么需要监控

  • 为了保证系统的稳定性, 可靠性, 可运维性
  • 了解集群的性能表现, 及时做出针对性调整
  • 集群出现问题及时报警, 帮助运维快速定位与解决问题

如何监控HBase集群

  • 利用Hadoop生态圈开源的专业监控工具(Ambari)
  • 自己调用Hadoop和HBase的JMX接口获取监测数据

顶级项目: Ambari

  • Ambari跟Hadoop等开源软件一样, 是Apache基金会的顶级项目
  • 创建 、 管理 、 监视Hadoop的集群 (Hadoop生态圈)
  • Ambari就是为了让Hadoop以及相关的大数据软件更容易使用的一个工具


Hadoop JMX监控实战

代码太多已打包上传到资源:https://download.csdn.net/download/bingdianone/10848206
实体类
DataNodeInfo :datanode的一些属性
HdfsSummary :hdfs的属性

工具类
JsonUtil :将json格式转化为某个类

StatefulHttpClient :访问http的客户端

MonitorMetrics:返回的是图中beans里的东西

HadoopUtil:获取Hadoop的一些属性以及打印出来

Hbase JMX监控实战

代码太多已打包上传到资源:https://download.csdn.net/download/bingdianone/10848206